package com.wlz.bitOperation;

/**
 *  位运算 -- 右移 (>>)
 *
 *   （正数左补0、负数左补1）
 * @author： wlz
 * @Date 2021/1/19 14:38
 * @description： TODO
 * @version: 1.0
 */
public class ShiftRight {

    public static void main(String[] args) {

        /**
         *  还是先将5转为2进制表示形式：
         *
         *  0000 0000 0000 0000 0000 0000 0000 0101 然后右移2位，高位补0：
         *
         *  00 00 0000 0000 0000 0000 0000 0000 0001
         *
         */
        // 结果 1
        System.out.println(5>>2);

        /**   负数以其正值的补码形式表达
         *  0000 0000 0000 0000 0000 0000 0000 0101 (-5 原码)
         *
         *  1111 1111 1111 1111 1111 1111 1111 1010 (-5反码)
         *
         *  1111 1111 1111 1111 1111 1111 1111 1011 (5补码)
         *
         *  11 11 1111 1111 1111 1111 1111 1111 1110  (右移2位)
         *
         *  0000 0000 0000 0000 0000 0000 0000 0001 （取反）
         *
         *  0000 0000 0000 0000 0000 0000 0000 0010 （加1 等于 2 加负号  等于 -2 ）
         *
         */
        // 结果 -2
        System.out.println(-5>>2);

        // 1111 1111 1111 1111 1111 1111 1111 1011
        System.out.println(Integer.toBinaryString(-5));


        /**  负数以其正值的补码形式表达
         *   0000 0000 0000 0000 0000 0000 0000 0111  (7 的二进制)
         *
         *   1111 1111 1111 1111 1111 1111 1111 1000 （7的反码）
         *
         *   1111 1111 1111 1111 1111 1111 1111 1001 （7的补码 、 -7的二进制）
         *
         *   11 11 1111 1111 1111 1111 1111 1111 1110 (右移2位)
         *
         *   0000 0000 0000 0000 0000 0000 0000 0001 （取反）
         *
         *   0000 0000 0000 0000 0000 0000 0000 0010 （加1 等于 2 加负号 等于 -2 ）
         *
         */
        // -2
        System.out.println(-7>>2);

        /**
         *   0000 0000 0000 0000 0000 0000 0000 1001  (9的二进制)
         *
         *   1111 1111 1111 1111 1111 1111 1111 0110 （9的反码）
         *
         *   1111 1111 1111 1111 1111 1111 1111 0111 （9的补码 、 -9的二进制）
         *
         *   11 11 1111 1111 1111 1111 1111 1111 1101 (右移2位)
         *
         *   0000 0000 0000 0000 0000 0000 0000 0010  （取反）
         *
         *   0000 0000 0000 0000 0000 0000 0000 0011  （加1 等于 3 加负号 等于 -3 ）
         */
        // -3
        System.out.println(-9>>2);

        /**
         *  0000 0000 0000 0000 0000 0000 0000 1011 (11的二进制)
         *
         *  1111 1111 1111 1111 1111 1111 1111 0100 （11的反码）
         *
         *  1111 1111 1111 1111 1111 1111 1111 0101 （11的补码、 -11 的二进制）
         *
         *  11 11 1111 1111 1111 1111 1111 1111 1101  (右移2位) (二进制负数)
         *
         *  0000 0000 0000 0000 0000 0000 0000 0010 （取反）
         *
         *  0000 0000 0000 0000 0000 0000 0000 0011 （加1 等于 3 加负号 等于 -3 ）
         */
        // -3
        System.out.println(-11>>2);


        /**
         *  0000 0000 0000 0000 0000 0000 0001 0101  (21 的二进制)
         *
         *  1111 1111 1111 1111 1111 1111 1110 1010  （21 的反码）
         *
         *  1111 1111 1111 1111 1111 1111 1110 1011  （21的补码， -21 的二进制）
         *
         *  11 11 1111 1111 1111 1111 1111 1111 1010  （右移2位  二进制负数）
         *
         *  0000 0000 0000 0000 0000 0000 0000 0101  （取反）
         *
         *  0000 0000 0000 0000 0000 0000 0000 0110 (加1 等于 6 加负号 等于 -6 )
         */
        // -6
        System.out.println(-21>>2);

    }
}
